iT邦幫忙

2021 iThome 鐵人賽

DAY 23
1
AI & Data

建立FF14資訊Discord chatbot系列 第 23

[DAY 23]糾團通知功能(3/3)

  • 分享至 

  • xImage
  •  

糾團的功能我把它切成兩個部分

  1. 使用者輸入訊息
  2. 背景執行
    今天介紹背景執行的部分

背景執行

這個部分主要是讓程式持續讀取資料庫裡的任務時間與現在時間相減是否在一小時以內

要讓程式持續讀取資料有兩個辦法
一個是用While迴圈另一個是用discord裡的tasks.loop()這函式記得要import進去:

from discord.ext import commands,tasks

函式裡面可以設定要多久時間執行一次程式碼,相當方便

這邊要特別注意時區轉換的部分

還記得先前我們在執行GCP時我們的服務是架在美國那邊,所以我們還需要把美國時區轉成台灣時區

轉換寫法如下:

from datetime import datetime,timezone,timedelta
now_time = datetime.utcnow().replace(tzinfo=timezone.utc)
now_time = now_time.astimezone(timezone(timedelta(hours=8)))
now_time = now_time.strftime('%m/%d-%H:%M')

接著就是判斷任務時間與現在時間相減是否在一小時以內

json檔裡會有多個任務存在所以需要用for迴圈遍歷每個任務時間

附上背景執行程式碼

class tasktiming(Cog_Extension):
    def __init__(self,*args,**kwargs):
        super().__init__(*args,**kwargs)
        self.tasktime.start()
        self.count=0
        self.id = 0

    @tasks.loop(seconds=10)
    async def tasktime(self):
        embed = discord.Embed()
        self.generalchannel = self.bot.get_channel(779782707080069193)#記得改成功會generalID
        
        self.channel = self.bot.get_channel(887264861510328340)#記得改糾團頻道ID
        #由於伺服器架在美國所以要轉時區
        now_time = datetime.utcnow().replace(tzinfo=timezone.utc)
        now_time = now_time.astimezone(timezone(timedelta(hours=8)))
        now_time = now_time.strftime('%m/%d-%H:%M')
        # print(now_time)
        with open("setting.json",'r',encoding="utf8") as jfile:
            jdata = json.load(jfile)
        # print(len(jdata))
        if len(jdata) >0:
            #遍例每筆資料確認每筆時間
            for key in list(jdata):
                # print(key, ":", jdata[key])
                if datetime.strptime(now_time, '%m/%d-%H:%M') < datetime.strptime(jdata[key]["time"], '%m/%d-%H:%M'):
                    remain_hour = datetime.strptime(jdata[key]["time"], '%m/%d-%H:%M')-datetime.strptime(now_time, '%m/%d-%H:%M')
                    remain_hour = remain_hour.seconds/3600#轉成小時
                    # print(remain_hour)
                    #剩餘時間小於一小時執行下面動作
                    if remain_hour < 1 :
                        # print("complete")
                        #在general頻道發通知
                        user_wordlist = ["有任務快開始囉~趕快來參加",f'任務名稱 : {jdata[key]["task"]}']+[f'時間 : {jdata[key]["time"]}']+[f'備註 : {jdata[key]["condition"]}' if "condition" in jdata[key] else '備註 : 無']+[f'[傳送門]( {jdata[key]["url"]})']
                        embed.description = "\n".join(user_wordlist)
                        await self.generalchannel.send(embed=embed)
                        self.count=1
                        del jdata[key]
                        with open("setting.json",'w',encoding="utf8") as jfile:
                            jdata = json.dump(jdata,jfile,indent=4)
                    else:
                        pass
                else:
                    del jdata[key]
                    with open("setting.json",'w',encoding="utf8") as jfile:
                            jdata = json.dump(jdata,jfile,indent=4)

最後呈現結果如下:


上一篇
[DAY 22]糾團通知功能(2/3)
下一篇
[DAY 24]Embed功能
系列文
建立FF14資訊Discord chatbot30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

1
虎虎
iT邦研究生 5 級 ‧ 2021-10-08 09:12:43

糾團?揪團? XDD

我要留言

立即登入留言